10.3 方法

动态调用方法,谈不上有多麻烦。只须按In列表准备好所需参数即可。

type X struct{}

func(X)Test(x,y int) (int,error) { return x+y,fmt.Errorf(“err: %d”,x+y) }

func main() { var a X

v:=reflect.ValueOf(&a) m:=v.MethodByName(“Test”)

in:= []reflect.Value{ reflect.ValueOf(1), reflect.ValueOf(2), }

out:=m.Call(in) for_,v:=range out{ fmt.Println(v) } }

输出:

3 err:3

对于变参来说,用CallSlice要更方便一些。

type X struct{}

func(X)Format(s string,a…interface{})string{ return fmt.Sprintf(s,a…) }

func main() { var a X

v:=reflect.ValueOf(&a) m:=v.MethodByName(“Format”)

out:=m.Call([]reflect.Value{ reflect.ValueOf(“%s= %d”), reflect.ValueOf(“x”), // 所有参数都须处理 reflect.ValueOf(100), })

fmt.Println(out)

out=m.CallSlice([]reflect.Value{ reflect.ValueOf(“%s= %d”), reflect.ValueOf([]interface{}{“x”,100}), // 仅一个 []interface{} 即可 })

fmt.Println(out) }

输出:

[x=100] [x=100]

无法调用非导出方法,甚至无法获取有效地址。